package mqtt_thingsboard_connector

import (
	channel_define "go-iot-gateway/internal/channel/connector/mqtt"
	"go-iot-gateway/internal/conf_table/define"
	"strconv"
	"strings"
	"time"
)

// 规约配置
type ThingsBoardMqttProtocolInfo struct {
	channel_define.MqttClientProtocolInfo
}

func NewThingsBoardMqttProtocolInfo(items []*conf_table_define.ProtocolInfo) *ThingsBoardMqttProtocolInfo {
	info := &ThingsBoardMqttProtocolInfo{
		channel_define.MqttClientProtocolInfo{
			UserName:        "go-iot-gateway",
			Password:        "go-iot-gateway",
			KeepAlive:       30, //秒
			SubscribeTopic:  "v1/gateway/",
			PublicTopic:     "v1/gateway/",
			TransferKey:     2,
			IsRetained:      false,
			EnableAnonymous: false,
			EnableBadQos:    false,
			DeviceNameField: "0",
		},
	}
	if len(items) == 0 {
		return info
	}

	//4		通用MQTT转发	开启变化上送	十进制	只发遥信变位
	//5		通用MQTT转发	变化上送周期(单位:秒)	十进制	5
	//8		通用MQTT转发	开启SSL	十进制	关闭
	//9		通用MQTT转发	SSL证书密码(可空)	字符串
	//10		通用MQTT转发	离线数据存储天数(0不存储)	十进制	0
	//11		通用MQTT转发	开启整点上传	十进制	关闭
	//13		通用MQTT转发	设备地址(0:公共地址,1：通信地址)	十进制	设备公共地址
	//14		通用MQTT转发	测点信息(0:简洁信息,1:详细信息,增加地址和描述)	十进制	简洁信息
	//18		通用MQTT转发	按设备发数据	十进制	按通道发

	for _, confInfo := range items {
		switch confInfo.F_no {
		case 0: //0		通用MQTT转发	MQTT账号(留空默认网关编号)	字符串	go-iot-gateway
			info.UserName = strings.TrimSpace(confInfo.F_value)
		case 1: //1		通用MQTT转发	MQTT密码(留空默认网关密码)	字符串	go-iot-gateway
			info.Password = strings.TrimSpace(confInfo.F_value)
		case 2: //2		通用MQTT转发	ClientID(留空为随机ID)	字符串
			info.SetClientId(confInfo.F_value)
		case 3: //3		通用MQTT转发	链路保活时间(单位:秒)	十进制	30
			info.KeepAlive = 30 * time.Second
			if strings.TrimSpace(confInfo.F_value) != "" {
				atoi, err := strconv.Atoi(confInfo.F_value)
				if err == nil && atoi > 0 {
					info.KeepAlive = time.Duration(atoi) * time.Second
				}
			}
		case 6: //6		通用MQTT转发	订阅主题	字符串	/dingiiot/linkqi/sub/${sn}
			info.SubscribeTopic = "v1/gateway/"
		case 7: //7		通用MQTT转发	发布主题	字符串	/dingiiot/linkqi/pub/${sn}
			info.PublicTopic = "v1/gateway/"
		case 12: //12		通用MQTT转发	转发测点ID类型	十进制	物模型标识
			info.TransferKey = 2
			atoi, err := strconv.Atoi(confInfo.F_value)
			if err == nil {
				switch atoi {
				case 0, 1, 2:
					info.TransferKey = atoi
				default:
					info.TransferKey = 2
				}
			}
		case 13: //12 设备地址(0:公共地址,1：通信地址)
			info.DeviceNameField = confInfo.F_value
		case 15: //15		通用MQTT转发	MQTT消息持久性(retained)	十进制	不保持
			info.IsRetained = false
		case 16: //16		通用MQTT转发	是否匿名登录	十进制	否
			info.EnableAnonymous = false
		case 17: //17		通用MQTT转发	不发质量码坏点	十进制	发送
			info.EnableBadQos = confInfo.F_value == "0"
		}

	}

	return info
}

//func (receiver *ThingsBoardMqttProtocolInfo) SubscribeTopics() string {
//	if strings.TrimSpace(receiver.MqttClientProtocolInfo.SubscribeTopics()) == "" {
//		return GATEWAY_MAIN_TOPIC
//	}
//	return receiver.MqttClientProtocolInfo.SubscribeTopics()
//}
